package org.song.controller;

import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.song.annotation.LogRecord;
import org.song.annotation.PowerEquals;
import org.song.annotation.RequestTimeRecord;
import org.song.exception.myException.CommonException;
import org.song.exception.result.AjaxResult;
import org.song.model.dto.BlogDto;
import org.song.model.vo.Blog;
import org.song.service.BlogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * 博客管理控制层
 */

@Api(tags = {"博客"})    // jdk五大引用数据类型 类、数组、接口、注解、枚举
// 使用 @interface 定义注解，使用时 和 枚举一样 使用 @注解名 实例化一个注解对象 @注解名(属性名=属性值),就是类似于new 类()调用有参构造一样！！！
// 注解 中的 属性 如果只有一个 并且 属性名为 value 那么再实例化该注解时 调用有参构造器 属性名可以省略不写。
// 注解 中的属性如果是一个数组 并且 如果在实例化该 注解时 给数组属性赋值 如果只注入一个 属性值。那么数组的大括号 也可以省略不写！！！
@Controller
@RequestMapping(value = "/blog")
public class BlogController {

    @Autowired( required = true )
    @Qualifier( value = "blogServiceImpl")
    private BlogService blogService;

    /**
     * 查询所有博客信息
     * @param blogDto
     * @return
     */
    //@RequestTimeRecord
    @RequestMapping(value = "/listBlogs" , method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "查询所有博客信息" , notes = "查询所有博客信息")
    public AjaxResult<PageInfo<Blog>> listBlogs(@ApiParam(value = "BlogDto查询参数接受") @NonNull BlogDto blogDto) {
        PageInfo<Blog> pageInfo = new PageInfo<Blog>( blogService.listBlogs(blogDto) );
      return AjaxResult.success(pageInfo);
    }

    /**
     * 根据博客信息删除指定博客
     * @param blog
     * @return
     */
    @PowerEquals
    @RequestTimeRecord
    @LogRecord
    @ApiOperation(value = "根据博客信息删除指定博客" , notes = "根据博客信息删除指定博客")
    @ResponseBody
    @RequestMapping(value = "/deleteBlog" , method = RequestMethod.DELETE)
    // @RequestBody注解 和 @ResponseBody 注解 @RequestBody注解首先要满足两个条件：1、该请求参数在请求体2、请求体中的参数必须是JSON格式的才可
    // @ResponseBody注解同样也是：1、将相应体中的参数以JSON格式进行响应回请求方。
    public AjaxResult<Integer> deleteBlog(@ApiParam(value = "根据博客信息删除指定博客") @NonNull Blog blog) {
        return AjaxResult.success(blogService.deleteBlog(blog));
    }

    /**
     * 根据博客信息插入一条博客数据
     * @param blog
     * @return
     * @throws CommonException
     */
    @PowerEquals
    @RequestTimeRecord
    @LogRecord
    @ApiOperation(value = "根据博客信息插入一条博客数据" , notes = "根据博客信息插入一条博客数据")
    @ResponseBody
    @RequestMapping(value = "/insertBlog" , method = RequestMethod.PUT)
    public AjaxResult<Integer> insertBlog(@ApiParam(value = "根据传入的博客信息进行插入博客数据") @RequestBody @Validated @NonNull Blog blog) throws CommonException {
        return AjaxResult.success(blogService.insertBlog(blog));
    }

    /**
     * 更新博客
     * @param blog
     * @return
     */
    @PowerEquals
    @RequestTimeRecord
    @LogRecord
    @ApiOperation(value = "更新博客" , notes = "更新博客")
    @ResponseBody
    @RequestMapping(value = "/updateBlog" , method = RequestMethod.POST)
    public AjaxResult<Integer> updateBlog(@ApiParam(value = "根据传入的博客信息进行博客更新") @NonNull @RequestBody Blog blog) {
        return AjaxResult.success(blogService.updateBlog(blog));
    }

    /**
     * 博客主页模糊搜索
     * @param queryParam
     * @return
     * @throws InterruptedException
     */
    @RequestTimeRecord
    @LogRecord
    @RequestMapping( value = "/blurrySearchBlogs" , method = RequestMethod.GET )
    @ResponseBody
    @ApiOperation( value = "博客主页模糊搜索" , notes = "博客主页模糊搜索" )
    public AjaxResult<PageInfo<Blog>> blurrySearchBlogs( @ApiParam( value = "博客主页模糊搜索" ) @RequestParam( value = "queryParam" , required = false ) String queryParam ) throws InterruptedException {
        return AjaxResult.success( new PageInfo<>( blogService.blurrySearchBlogs( queryParam ) ) );
    }

}
